home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 20
/
Cream of the Crop 20 (Terry Blount) (1996).iso
/
program
/
freeli20.zip
/
386lib2.asx
< prev
next >
Wrap
Text File
|
1996-07-01
|
64KB
|
2,409 lines
~~~C_STR1
Ideal
Public strlen,strcpy,strcat,strcmp
Model Tiny
CodeSeg
P386
;****************** strlen() -- Get length of string
;int strlen(char *strp);
strp equ bp+4
Proc strlen
push bp ;Set up stack frame
mov bp,sp
push si ;Save SI
mov si,[strp] ;SI = string pointer
p1_loop: lodsb ;Load char
test al,al ;Loop while not zero
jnz p1_loop
sub si,[strp] ;AX = length
dec si
xchg ax,si
pop si ;Restore SI
pop bp ;Delete stack frame
ret 2 ;Return
EndP strlen
;****************** strcpy() -- Copy a string
;void strcpy(char *str1, char *str2);
str1 equ bp+6
str2 equ bp+4
Proc strcpy
push bp ;Set up stack frame
mov bp,sp
pusha ;Save all registers
mov si,[str2] ;SI = source
mov di,[str1] ;DI = destination
p2_loop: lodsb ;Load char
mov [di],al ;Store char
inc di
test al,al ;Loop while not zero
jnz p2_loop
popa ;Restore registers
pop bp ;Delete stack frame
ret 4 ;Return
EndP strcpy
;****************** strcat() -- Concatenate strings
;void strcat(char *str1, char *str2);
str1 equ bp+6
str2 equ bp+4
Proc strcat
push bp ;Set up stack frame
mov bp,sp
pusha ;Save all registers
mov si,[str1] ;SI = destination
p3_cloop: lodsb ;Load char
test al,al ;Loop while not zero
jnz p3_cloop
mov di,si ;DI = destination
mov si,[str2] ;SI = source
dec di
p3_loop: lodsb ;Load char
mov [di],al ;Store char
inc di
test al,al ;Loop while not zero
jnz p3_loop
popa ;Restore registers
pop bp ;Delete stack frame
ret 4 ;Return
EndP strcat
;****************** strcmp() -- Compare strings
;void strcmp(char *str1, char *str2);
str1 equ bp+6
str2 equ bp+4
Proc strcmp
push bp ;Set up stack frame
mov bp,sp
push si di ;Save registers
mov si,[str1] ;SI = source
mov di,[str2] ;DI = destination
p4_loop: lodsb ;Load char 1
mov ah,[di] ;Load char 2
inc di
cmp al,ah ;Not equal?
jne p4_nope
test al,al ;Loop while not zero
jnz p4_loop
xor ax,ax ;Equal, return 0
p4_done: pop di si ;Restore registers
pop bp ;Delete stack frame
ret 4 ;Return
p4_nope: sub al,ah ;Not equal, return difference
cbw ;in first unequal position
jmp p4_done
EndP strcmp
End
~~~C_STR2
Ideal
Extrn strlen:near
Public strchr,strstr
Model Tiny
CodeSeg
P386
;****************** strchr() -- Search string for char
;int strchr(char *strp, int chr);
strp equ bp+6
chr equ bp+4
Proc strchr
push bp ;Set up stack frame
mov bp,sp
push si ;Save SI
mov si,[strp] ;SI = string pointer
mov ah,[chr] ;AH = char
p1_loop: lodsb ;Load char
test al,al ;Null, not found
jz p1_nope
cmp al,ah ;Loop while not equal
jne p1_loop
sub si,[strp] ;AX = position of char
dec si
xchg ax,si
p1_done: pop si ;Restore SI
pop bp ;Delete stack frame
ret 4 ;Return
p1_nope: mov ax,-1 ;Not found, return -1
jmp p1_done
EndP strchr
;****************** strstr() -- Search string for substring
;int strstr(char *strp, char *subp);
strp equ bp+6
subp equ bp+4
Proc strstr
push bp ;Set up stack frame
mov bp,sp
push es ;Save registers
pusha
push ds ;ES = DS
pop es
mov si,[strp] ;SI = string pointer
mov bx,[subp] ;BX = substring pointer
push bx ;Get length of substring
call strlen ;into DX
xchg dx,ax
mov ah,[bx] ;AH = first char
p3_loop: lodsb ;Load char
test al,al ;Null, not found
jz p3_nope
cmp al,ah ;Loop while not equal
jne p3_loop
mov cx,dx ;CX = length
mov di,bx ;DI = substring
push si ;Save SI
dec si ;Push back char
repe cmpsb ;Compare strings
pop si ;Restore SI
jne p3_loop ;Loop if not equal
sub si,[strp] ;AX = position of char
dec si
mov es,si ;Sneaky: save it in ES
p3_done: popa ;Restore registers
mov ax,es ;Return value in AX
pop es
pop bp ;Delete stack frame
ret 4 ;Return
p3_nope: mov ax,-1 ;Not found, return -1
mov es,ax
jmp p3_done
EndP strstr
End
~~~C_STR3
Ideal
Public stricmp,strlwr,strupr
Model Tiny
CodeSeg
P386
;****************** stricmp() -- Compare strings, case insensitive
;void stricmp(char *str1, char *str2);
str1 equ bp+6
str2 equ bp+4
Proc stricmp
push bp ;Set up stack frame
mov bp,sp
push si di ;Save registers
mov si,[str1] ;SI = source
mov di,[str2] ;DI = destination
p1_loop: lodsb ;Load char 1
mov ah,[di] ;Load char 2
inc di
cmp al,'a' ;Convert AL to uppercase
jb p1_setAH
cmp al,'z'
ja p1_setAH
sub al,20h
p1_setAH: cmp ah,'a' ;Convert AH to uppercase
jb p1_comp
cmp ah,'z'
ja p1_comp
sub ah,20h
p1_comp: cmp al,ah ;Equal?
jne p1_nope
test al,al ;Loop while not zero
jnz p1_loop
inc ax ;Equal, return 1
p1_done: pop di si ;Restore registers
pop bp ;Delete stack frame
ret 4 ;Return
p1_nope: xor ax,ax ;Not equal, return 0
jmp p1_done
EndP stricmp
;****************** strlwr() -- Convert string to lowercase
;int strlwr(char *strp);
strp equ bp+4
Proc strlwr
push bp ;Set up stack frame
mov bp,s